package java_cup_11a.runtime;

import edu.mit.csail.sdg.alloy4.Pos;

/**
 * Defines the Symbol class, which is used to represent all terminals
 * and nonterminals while parsing.  The lexer should pass CUP Symbols 
 * and CUP returns a Symbol.
 *
 * @version last updated: 7/3/96
 * @author  Frank Flannery
 */

/* ****************************************************************
 Class Symbol
 what the parser expects to receive from the lexer. 
 the token is identified as follows:
 sym:    the symbol type
 parse_state: the parse state.
 value:  is the lexical value of type Object
 left :  is the left position in the original input file
 right:  is the right position in the original input file
 xleft:  is the left position Object in the original input file
 xright:  is the left position Object in the original input file
 ******************************************************************/

public class Symbol {

	/** Constructs a new Symbol */
	public Symbol(int sym, Pos pos, Object value) {
		this.sym=sym;
		this.pos=pos;
		this.value=value;
	}	

	/** Constructs a new Symbol */
	public Symbol(int sym, Pos pos, Object value, int initialState) {
		this.sym=sym;
		this.pos=pos;
		this.value=value;
		this.parse_state=initialState;
	}	

	/** The symbol number of the terminal or non terminal being represented */
	public int sym;
	
	/** The parse state to be recorded on the parse stack with this symbol.
	 *  This field is for the convenience of the parser and shouldn't be 
	 *  modified except by the parser. 
	 */
	public int parse_state = (-1);
	
	/** This allows us to catch some errors caused by scanners recycling
	 * symbols.  For the use of the parser only. [CSA, 23-Jul-1999] */
	boolean used_by_parser = false;

	/** The position. */
	public Pos pos;
	
	/** The value. */
	public Object value;
}
